const fs = require("fs");
var express = require("express");
var bodyParser = require("body-parser");
var path = require("path");
// 路由加载
var mount = require("mount-routes");

var app = express();

/**
 *
 * 公共系统初始化
 *
 */
app.use(bodyParser.json());
app.use(bodyParser.urlencoded({ extended: true }));

// 初始化数据库模块
var database = require("./modules/database");
database.initialize(app, function(err) {
  if (err) {
    console.error("连接数据库失败失败 %s", err);
  }
});

/**
 *
 *	后台管理系统初始化
 *
 */
// 获取管理员逻辑模块
var managerService = require(path.join(
  process.cwd(),
  "services/ManagerService"
));
// 获取角色服务模块
var roleService = require(path.join(process.cwd(), "services/RoleService"));

// 设置跨域和相应数据格式
app.all("/api/*", function(req, res, next) {
  res.header("Access-Control-Allow-Origin", "*");
  res.header("Access-Control-Allow-Headers", "X-Requested-With, mytoken");
  res.header("Access-Control-Allow-Headers", "X-Requested-With, Authorization");
  res.setHeader("Content-Type", "application/json;charset=utf-8");
  res.header(
    "Access-Control-Allow-Headers",
    "Content-Type,Content-Length, Authorization, Accept,X-Requested-With"
  );
  res.header("Access-Control-Allow-Methods", "PUT,POST,GET,DELETE,OPTIONS");
  res.header("X-Powered-By", " 3.2.1");
  if (req.method == "OPTIONS") res.sendStatus(200);
  /*让options请求快速返回*/ else next();
});

// 初始化统一响应机制
var resextra = require("./modules/resextra");
app.use(resextra);

// 初始化 后台登录 passport 策略
admin_passport = require("./modules/passport");
// 设置登录模块的登录函数衔接 passport 策略
admin_passport.setup(app, managerService.login);
// 设置 passport 登录入口点
app.use("/api/private/v1/login", admin_passport.login);
// 设置 passport 验证路径
app.use("/api/private/v1/*", admin_passport.tokenAuth);

// 获取验证模块
var authorization = require(path.join(process.cwd(), "/modules/authorization"));

// 设置全局权限
authorization.setAuthFn(function(
  req,
  res,
  next,
  serviceName,
  actionName,
  passFn
) {
  if (!req.userInfo || isNaN(parseInt(req.userInfo.rid)))
    return res.sendResult("无角色ID分配");
  // 验证权限
  roleService.authRight(req.userInfo.rid, serviceName, actionName, function(
    err,
    pass
  ) {
    passFn(pass);
  });
});

/**
 *
 * 初始化路由
 *
 */
// 带路径的用法并且可以打印出路有表
mount(app, path.join(process.cwd(), "/routes"), true);

app.all("/ueditor/ue", function(req, res, next) {
  res.header("Access-Control-Allow-Origin", "*");
  res.header("Access-Control-Allow-Headers", "X-Requested-With, mytoken");
  res.header("Access-Control-Allow-Headers", "X-Requested-With, Authorization");
  res.header(
    "Access-Control-Allow-Headers",
    "Content-Type, Content-Length, Authorization, Accept, X-Requested-With, X_Requested_With"
  );
  res.header("Access-Control-Allow-Methods", "PUT,POST,GET,DELETE,OPTIONS");
  res.header("X-Powered-By", " 3.2.1");
  if (req.method == "OPTIONS") res.send(200);
  /*让options请求快速返回*/ else next();
});

// 富文本编辑器上传
var ueditor = require(path.join(process.cwd(), "/modules/ueditor"));
// 富文本控件处理qing q
app.use("/ueditor/ue", ueditor);
//. 设置富文本空间地址
app.use("/ueditor", express.static("public/ueditor"));

app.use("/tmp_uploads", express.static("tmp_uploads"));
app.use("/x/common", express.static("uploads/common"));
app.use("/uploads/goodspics", express.static("uploads/goodspics"));

var upload_config = require("config").get("upload_config");
app.use(
  "/" + upload_config.get("upload_ueditor"),
  express.static(upload_config.get("upload_ueditor"))
);

const logistics = require("./modules/Logistics.js");
app.get("/api/private/v1/kuaidi/:orderno", logistics.getLogisticsInfo);

// 定义日志
// var log4js = require('./modules/logger');
// log4js.use(app);

/**
 *
 * 统一处理无响应
 *
 */
// 如果没有路径处理就返回 Not Found
app.use(function(req, res, next) {
  res.sendResult(null, 404, "Not Found");
});

app.listen(8888);

module.exports = app;
